const whiteList = ["/login", "/codes"];

module.exports = () => {
    // 返回一个 Koa 中间件
    return async (ctx, next) => {
        if (whiteList.includes(ctx.path)) {
            await next();
            // 没在白名单内，需要校验 token（也就是需要校验身份）
        } else {
            // 从「请求头」中获取 token
            const token = ctx.headers.token;
            // 没拿到，不能通过
            if (!token) {
                ctx.body = {
                    code: 401,
                    message: "无法获取token",
                };
                return;
            }
            // 拿到了 token，校验 token 合不合法
            try {
                const user = ctx.helper.checkToken(token);
                // controller/service 就可以拿到用户信息了
                ctx.user = user;
                // 解析失败，判断错误类型，响应客户端
            } catch (error) {
                // token 过期了
                if (error.name === "TokenExpiredError") {
                    ctx.body = {
                        code: 401,
                        message: "token过期了",
                    };
                    return;
                }

                // token 篡改
                if (error.name === "JsonWebTokenError") {
                    ctx.body = {
                        code: 401,
                        message: "token不合法",
                    };
                    return;
                }

                ctx.body = {
                    code: 401,
                    message: "未知错误类型",
                };
                return;
            }

            // 解析成功了，向下执行
            await next();
        }
    };
};
